在前幾個章節我們介紹到在實作API中如何傳遞參數,接下來我們將會用一個簡易的專案帶大家更了解 FastAPI。
那在實作之前,我們先介紹在FastAPI中常用的專案架構。
一個好的專案架構應該是一個擁有一致性、簡單明瞭、且不會出乎人預料之外的結構:
以下我們介紹兩種範例架構
fastapi-project
├── alembic/
├── src
│ ├── schemas.py # pydantic models
│ ├── dependencies.py
│ ├── constants.py
│ ├── service.py
│ ├── utils.py
│ ├── config.py # global configs
│ ├── models.py # global models
│ ├── exceptions.py # global exceptions
│ ├── pagination.py # global module e.g. pagination
│ ├── database.py # db connection related stuff
│ └── main.py
├── tests/
│ ├── auth
│ ├── aws
│ └── posts
├── templates/
│ └── index.html
├── requirements
│ ├── base.txt
│ ├── dev.txt
│ └── prod.txt
├── .env
├── .gitignore
├── logging.ini
└── alembic.ini
此架構範例為 FastAPI 作者在官方文件案例中所使用,概念為按類型分離文件,此種架構對於小專案或是微服務是相當好用,但如果專案中包含太多模組就會變的雜亂。
fastapi-project
├── alembic/
├── src
│ ├── auth
│ │ ├── router.py
│ │ ├── schemas.py # pydantic models
│ │ ├── models.py # db models
│ │ ├── dependencies.py
│ │ ├── config.py # local configs
│ │ ├── constants.py
│ │ ├── exceptions.py
│ │ ├── service.py
│ │ └── utils.py
│ ├── aws
│ │ ├── client.py # client model for external service communication
│ │ ├── schemas.py
│ │ ├── config.py
│ │ ├── constants.py
│ │ ├── exceptions.py
│ │ └── utils.py
│ └── posts
│ │ ├── router.py
│ │ ├── schemas.py
│ │ ├── models.py
│ │ ├── dependencies.py
│ │ ├── constants.py
│ │ ├── exceptions.py
│ │ ├── service.py
│ │ └── utils.py
│ ├── config.py # global configs
│ ├── models.py # global models
│ ├── exceptions.py # global exceptions
│ ├── pagination.py # global module e.g. pagination
│ ├── database.py # db connection related stuff
│ └── main.py
├── tests/
│ ├── auth
│ ├── aws
│ └── posts
├── templates/
│ └── index.html
├── requirements
│ ├── base.txt
│ ├── dev.txt
│ └── prod.txt
├── .env
├── .gitignore
├── logging.ini
└── alembic.ini
在 zhanymkanov/fastapi-best-practices: FastAPI Best Practices and Conventions we used at our startup (github.com) 中,作者受到 Netflix 的 Dispatch 專案啟發,提出了此種架構,該架構對於微型架構更具可擴展性,適用於大型單體專案。
在實作中,我們將所有程式碼目錄存放在 src 文件夾中:
每個套件都有自己的路由器(router)、模式(schemas)、模型(models)等。
當套件需要來自其他套件的服務、相依性或變數時,請使用明確的模組名稱 ( 絕對路徑 ) 導入它們。
from src.auth import constants as auth_constants
from src.notifications import service as notification_service
from src.posts.constants import ErrorCode as PostsErrorCode # in case we have Standard ErrorCode in constants module of each package
專案架構對於一個專案來說可以說是一個十分重要的基底,架構做得好可以大大的增加開發的順暢度以及後續維護的簡易性。
我們了解完通常會如何構建一個 FastAPI 的專案後,接下來幾天的介紹將會著重在用一個簡單的題目來實作。
https://github.com/zhanymkanov/fastapi-best-practices
更大的应用 - 多个文件 - FastAPI (tiangolo.com)